package com.liu.tools;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @DateTime 2014年11月28日 上午11:47:01
 * @Company 华视传媒
 * @Author 刘兴密
 * @QQ 63972012
 * @Desc 华视传媒日期工具类
 */
public class DateUtil {

	public static final String FORMAT_DAY = "yyyyMMdd";

	public static final String FORMAT_DATE = "yyyy-MM-dd";

	public static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss";

	public static final String FORMAT_MINUTE = "yyyy-MM-dd HH:mm";

	public static final String START_TIME_SUFFIX = " 00:00:00";

	public static final String END_TIME_SUFFIX = " 23:59:59";
	
	public static final String FORMAT_ALL_DAY = "yyyyMMddHHmmss";
	
	public static final String FORMAT_TIME_STAMP = "yyyyMMddHHmmssSSS";

	private static SimpleDateFormat sf = null;

	public static String format(Date date, String format) {
		if (null == date)
			return null;

		sf = new SimpleDateFormat(format);
		return sf.format(date);
	}

	public static Date format(String dateStr, String format) {
		if (StrUtil.isNull(dateStr))
			return null;

		try {
			sf = new SimpleDateFormat(format);
			return sf.parse(dateStr);
		} catch (ParseException e) {
		}

		return null;
	}

	/**
	 * @DateTime 2014年11月28日 上午11:49:55
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 开始结束时间拼接
	 * @param date
	 * @param format
	 * @param suffixFlag
	 *            是否添加时间后缀
	 * @param timeFlag
	 *            (1/2,开始时间/结束时间)
	 * @return String
	 */
	public static String format(Date date, String format, boolean suffixFlag,
			int timeFlag) {
		if (null == date)
			return null;

		sf = new SimpleDateFormat(format);
		return suffixFlag ? (timeFlag == 1 ? sf.format(date)
				+ START_TIME_SUFFIX : sf.format(date) + END_TIME_SUFFIX) : sf
				.format(date);
	}

	public static String formatMill() {
		Date date = Calendar.getInstance().getTime();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		return sdf.format(date);
	}

	/**
	 * @DateTime 2015年10月17日 上午11:21:36
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 获取当前时间的毫秒数，格式：yyyyMMddHHmmssSSS
	 * @return
	 * Long
	 */
	public static Long getCurrentFormatMill(){
		return Long.valueOf(formatMill());
	}
	
	/**
	 * @DateTime 2015年10月17日 下午4:13:32
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 获取日期的毫秒值
	 * @param date
	 * @return
	 * Long
	 */
	public static Long getDateMill(Date date){		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		return Long.valueOf(sdf.format(date));
	}
	
	/**
	 * @DateTime 2014年12月26日 下午2:36:15
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 设置日期的小时值
	 * @param date
	 * @param hour
	 * @return Date
	 */
	public static Date setHour(Date date, int hour) {

		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, hour);
		return calendar.getTime();
	}

	/**
	 * @DateTime 2014年12月26日 下午2:39:53
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 为指定日期增加天数
	 * @param date
	 * @param day
	 * @return Date
	 */
	public static Date addDay(Date date, int amount) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, amount);
		return calendar.getTime();
	}
	
	/**
	 * @DateTime 2015年10月17日 下午4:10:50
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 增加日期
	 * @param date
	 * @param type 增加类型，使用标准Calendar日期类型值
	 * @param amount
	 * @return
	 * Date
	 */
	public static Date addDate(Date date, int type, int amount) {
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(type, amount);
		return calendar.getTime();
	}

	/**
	 * @DateTime 2014年12月26日 下午2:54:02
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 比较日期大小 date1 是否 大于date2 （大于 ：1 等于：0 小于：-1）
	 * @param date1
	 *            格式（yyyy-MM-dd HH:mm:ss）
	 * @param date2
	 *            格式 （yyyy-MM-dd HH:mm:ss）
	 * @return int
	 */
	public static int compareDate(Date date1, Date date2) {

		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

		String dateStr1 = format.format(date1);
		String dateStr2 = format.format(date2);

		long dateLong1 = Long.parseLong(dateStr1);
		long dateLong2 = Long.parseLong(dateStr2);
		if (dateLong1 > dateLong2) {
			return 1;
		}

		if (dateLong1 < dateLong2) {
			return -1;
		}

		return 0;
	}
	
	/**
	 * @DateTime 2014年12月26日 下午2:58:13
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc  获取整点日期即将分和秒赋为0
	 * @param date
	 * @return
	 * Date
	 */
	public static Date getIntPointDate(Date date){
		Calendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return calendar.getTime();
	}

	/**
	 * @DateTime 2014年12月26日 下午2:58:13
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc  获取不可操作日子
	 * @param date
	 * @return
	 * Date
	 */
    public static void displayDays(String dateFirst, String dateSecond,StringBuffer buf){
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try{
            Date dateOne = dateFormat.parse(dateFirst);
            Date dateTwo = dateFormat.parse(dateSecond);
             
            Calendar calendar = Calendar.getInstance();
             
            calendar.setTime(dateOne);
           
            while(calendar.getTime().before(dateTwo)){    
            	if(!buf.toString().equals("")){
            		buf.append(",");
            	}
            	buf.append(dateFormat.format(calendar.getTime()));
                calendar.add(Calendar.DAY_OF_MONTH, 1);               
            }
            
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    
    /**
     * 
     * @description: 按日期格式返回月份第一天.
     * @author: liuxmi
     * @Date:Sep 9, 2009
     * @return
     * @return:String
     */
    public static String getFirstDayOfMonth(Date date, String format) {
    
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, 1);
        SimpleDateFormat simpleFormate = new SimpleDateFormat(format);
        return simpleFormate.format(calendar.getTime());
    }
    
    /**
     * 
     * @description: 按日期格式返回月份最后天.
     * @author: liuxmi
     * @Date:Sep 9, 2009
     * @return
     * @return:String
     */
    public static String getLastDayOfMonth(Date date, String format) {
    	
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, 1);
        calendar.roll(Calendar.DATE, -1);
        SimpleDateFormat simpleFormate = new SimpleDateFormat(format);
        return simpleFormate.format(calendar.getTime());
    }

}
